package com.arquitectonic.client.datosYlogica;

import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

import com.arquitectonic.client.datosYlogica.GestorLogin.ProgressData;
import com.arquitectonic.client.datosYlogica.vistas.Vista;
import com.arquitectonic.client.extensiones.Par;
import com.arquitectonic.client.interfaz.grillas.ListGridPreferencias;
import com.arquitectonic.client.servicios.Proxy;
import com.arquitectonic.compartido.Preferencia;
import com.arquitectonic.compartido.Seccion;
import com.arquitectonic.compartido.ServerException;
import com.arquitectonic.compartido.Stakeholder;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;

public class GestorPreferencias{

	private static Collection<Preferencia> listapreferencias= new LinkedList();
	private static Map<String, Par<Record, Map<String, Preferencia>>> preferencias = new HashMap();// Map<String,Map<String,Integer>

	//DONE
	public static void reconstruirListGrid(LinkedList<Vista> vs) {
		ListGridField[] campos = new ListGridField[vs.size() + 1];

		campos[0] = new ListGridField("nombreStakeholder", "Stakeholder");
		campos[0].setCanEdit(false);

		int pos = 1;
		for (Vista v : vs) {
			campos[pos] = new ListGridField(v.getNombreVista(),v.getNombreVista());
			campos[pos].setValueMap(Seccion.NIVELESDEDETALLE_VISTAS);
			campos[pos].setCanEdit(true);
			pos++;
		}
		ListGridPreferencias.getInstance().setFields(campos);
	}

	// DONE
	public static void agregarStakeholder(Stakeholder s) {
		Record r = new ListGridRecord();
		r.setAttribute("nombreStakeholder", s.getNombreStakeholder());

		ListGridPreferencias.getInstance().addData(r);
		preferencias.put(s.getNombreStakeholder(),
				new Par<Record, Map<String, Preferencia>>(r,
						new HashMap<String, Preferencia>()));
		
	}

	// DONE
	public static void borrarStakeholder(Stakeholder s) {
		ListGridPreferencias.getInstance().removeData(
				preferencias.get(s.getNombreStakeholder()).primero);
		
		Par<Record, Map<String, Preferencia>> prefs=preferencias.get(s.getNombreStakeholder());
		for(Preferencia p:prefs.segundo.values()){
			GestorVistas.actualizacionPreferencia(p,p.getNivelDeseado(), Seccion.INT_NOTHING);
			listapreferencias.remove(p);
		}
		
		preferencias.remove(s.getNombreStakeholder());
	}

	// DONE
	static AsyncCallback<Collection<Preferencia>> callbackGetPreferencias = new AsyncCallback<Collection<Preferencia>>() {
		@Override
		public void onSuccess(Collection<Preferencia> result) {

			listapreferencias.clear();
			for (Preferencia p:result) {
				Par<Record, Map<String, Preferencia>> aux = preferencias.get(p.getNombreStakeholder());
				if (aux != null) {
					Record pref = aux.primero;
					pref.setAttribute(p.getNombreVista(), Seccion.nivelDeDetalleToString(p.getNivelDeseado()));
					aux.segundo.put(p.getNombreVista(), p);
					listapreferencias.add(p);
				}
			}
			ProgressData.getInstance().dataSourceFinalizado();
		}

		@Override
		public void onFailure(Throwable caught) {
			SC.warn(caught.getMessage());
		}
	};
	public static void cargarPreferencias() throws ServerException {
		Proxy.getServicios().getPreferencias(callbackGetPreferencias);
	}

	//DONE
	public static Collection<Preferencia> getPreferenciasStakeholder(String nombreStakeholder) {
		Par<Record,Map<String,Preferencia>> ps=preferencias.get(nombreStakeholder);
		if(ps!=null){
			return ps.segundo.values();
		}else
			return null;
	}
	//DONE
	public static Collection<Preferencia> getElementos() {
		return listapreferencias;
	}
	
	//DONE
	public static void editarPreferencia(String stakeholder, String vista, String nivelDeseado) {
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onSuccess(Boolean result) {

			}

			@Override
			public void onFailure(Throwable caught) {
				SC.warn(caught.getMessage());
			}
		};

		if (nivelDeseado != null) {
			try {
				int intnivelDeseado = Seccion.nivelDeDetalleToInt(nivelDeseado);
				Par<Record, Map<String, Preferencia>> aux = preferencias.get(stakeholder);
				if (aux != null) {
					Preferencia p = aux.segundo.get(vista);
					int nivelAnterior;
					if (p == null) {
						//System.out.println("Nueva preferencia---");
						p = new Preferencia(stakeholder, vista,intnivelDeseado);
						aux.primero.setAttribute(p.getNombreVista(), nivelDeseado);
						aux.segundo.put(p.getNombreVista(), p);
						listapreferencias.add(p);
						nivelAnterior=0;
					}else{
						nivelAnterior=p.getNivelDeseado();
						p.setNivelDeseado(intnivelDeseado);
					}
					
					GestorVistas.actualizacionPreferencia(p,nivelAnterior, intnivelDeseado);
					
					Proxy.getServicios().addPreferencia(new Preferencia(stakeholder, vista,intnivelDeseado), callback);
				}

			} catch (Exception e) {
				SC.warn(e.getMessage());
			}
		}
	}

	public static void setearPreferenciasPorDefecto() {
		AsyncCallback<Collection<Preferencia>> callback = new AsyncCallback<Collection<Preferencia>>() {
			@Override
			public void onSuccess(Collection<Preferencia> result) {
				
				ListGridPreferencias.getInstance().selectAllRecords();
				ListGridPreferencias.getInstance().removeSelectedData();
				
				System.out.println("Seteando por defecto");
				
				for(Stakeholder s: GestorStakeholders.getInstance().getElementos()){
					agregarStakeholder(s);
				}
				
				listapreferencias.clear();
				for (Preferencia p:result) {
					Par<Record, Map<String, Preferencia>> aux = preferencias.get(p.getNombreStakeholder());
					if (aux != null) {
						Record pref = aux.primero;
						pref.setAttribute(p.getNombreVista(), Seccion.nivelDeDetalleToString(p.getNivelDeseado()));
						aux.segundo.put(p.getNombreVista(), p);
						listapreferencias.add(p);
					}
				}
				
				ListGridPreferencias.getInstance().fetchData();
				
    			GestorVistas.recargarPreferencias(listapreferencias);
    			GestorStakeholders.actualizarSatisfaccionStakeholders();
			}

			@Override
			public void onFailure(Throwable caught) {
				SC.warn(caught.getMessage());
			}
		};
		
		System.out.println("Setear pref por defecto:");
		Proxy.getServicios().setPreferenciasPorDefecto(GestorStakeholders.getInstance().getElementos(),
				GestorVistas.getTiposVistas(),callback);
	}



}
